from fastmcp import FastMCP
import asyncio

class CalculatorServer:
    def __init__(self):
        # 创建FastMCP服务器实例
        self.mcp = FastMCP(name="calculator", instructions="这是一个计算服务器，可以执行加减乘除运算")
        
        # 注册计算工具
        self._register_tools()
    
    def _register_tools(self):
        # 加法工具
        @self.mcp.tool(name="add", description="计算两个数的和")
        async def add(a: float, b: float) -> float:
            result = a + b
            print(f"计算: {a} + {b} = {result}")
            return result
        
        # 减法工具
        @self.mcp.tool(name="subtract", description="计算两个数的差")
        async def subtract(a: float, b: float) -> float:
            result = a - b
            print(f"计算: {a} - {b} = {result}")
            return result
        
        # 乘法工具
        @self.mcp.tool(name="multiply", description="计算两个数的积")
        async def multiply(a: float, b: float) -> float:
            result = a * b
            print(f"计算: {a} * {b} = {result}")
            return result
        
        # 除法工具
        @self.mcp.tool(name="divide", description="计算两个数的商")
        async def divide(a: float, b: float) -> float:
            if b == 0:
                raise ValueError("错误：除数不能为零")
            result = a / b
            print(f"计算: {a} / {b} = {result}")
            return result
    
    def run(self):
        # 使用HTTP传输协议运行服务器
        print("计算服务器启动在 0.0.0.0:25565")
        try:
            # 使用http传输并指定端口
            self.mcp.run(transport="http", host="0.0.0.0", port=25565)
        except KeyboardInterrupt:
            print("\n服务器正在关闭...")

# 修改main函数不再是async函数，因为FastMCP的run是同步方法
def main():
    server = CalculatorServer()
    # FastMCP的run()方法是同步的，直接调用
    server.run()

if __name__ == "__main__":
    # 直接调用main函数，因为它现在是同步的
    main()